#include "main.h"

#include <QApplication>
#include <QFile>
#include <QMessageBox>
#include <QProcess>
#include <QRegExp>
#include <QStringList>
#include <QTextCodec>
#include <QTranslator>

#include "core/music_constraints.h"
#include "gui/main_window.h"

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // utilisation d'UTF-8 pour les chaînes de caractères C
  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

  // mise en place de la localisation française
  // (utilisé notamment pour les QFileDialog)
  QTranslator qtTranslator;
  qtTranslator.load(":qm/qt_fr.qm");
  app.installTranslator(&qtTranslator);

  if(checkNeededPrograms()) {
    srand(time(NULL));

    MainWindow mainWindow;
    mainWindow.show();

    return app.exec();
  }
}

/*!
 * Vérifie si les programmes requis sont bien installés et exécutables
 * S'il manque un programme, affiche un message avec la liste des programmes
 * manquants et renvoie false
 */
bool checkNeededPrograms() {
  bool ok = true;
  QString message = "Certains exécutables nécessaires au bon fonctionnement du "
                    "logiciel n'ont pas été trouvés dans le PATH ou bien ils "
                    "ne sont pas exécutables.<br>"
                    "<br>"
                    "Vous devez installer :"
                    "<ul>";

  QStringList env = QProcess::systemEnvironment();
  int index = env.indexOf(QRegExp("^PATH=.*"));
  QString path = env[index];
  path.remove(0,5);

  QStringList dirs = path.split(":");

  if(!checkProgram(dirs, "lilypond")) {
    message += "<li><b>LilyPond</b> (nom de l'exécutable : lilypond)</li>";
    ok = false;
  }

  if(!checkProgram(dirs, "mogrify")) {
    message += "<li><b>ImageMagick</b> (nom de l'exécutable : mogrify)</li>";
    ok = false;
  }

  if(!checkProgram(dirs, "timidity")) {
    message += "<li><b>TiMidity++</b> (nom de l'exécutable : timidity)</li>";
    ok = false;
  }

  message += "</ul>";

  if(!ok)
    QMessageBox::critical(0, "Erreur", message);

  return ok;
}

/*!
 * Teste si un programme se trouve dans le PATH et s'il est exécutable
 */
bool checkProgram(const QStringList &dirs, const QString &program) {
  bool ok = false;
  QString dir;

  foreach(dir, dirs) {
    QFile file(dir + "/" + program);
    if((file.permissions() &
          (QFile::ExeOwner | QFile::ExeGroup | QFile::ExeOther)) ==
       (QFile::ExeOwner | QFile::ExeGroup | QFile::ExeOther)) {
      ok = true;
      break;
    }
  }

  return ok;
}
